/******************************************************************
 * 文件：TLink.c
 * 功能：实现TLink云平台的TCP连接相关函数
 * 日期：2018-04-11
 * 作者：zx
 * 版本：Ver.1.0 | 最初版本
 * 
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "stdio.h"
#include "string.h"
#include "TLink.h"
#include "NetWork.h"
#include "LED/LED.h"

#include "RELAY/Relay.h"
#include "DELAY/Delay.h"
#include "IIC/IIC.h"
#include "OLED/OLED.h"
extern u8 RXBuffer[RXBUFFER_LEN];
extern DeviceSta_Strcture device;
extern u8 SetStan;
/**
 * 功能：连接TLink云平台
 * 参数：None
 * 返回值：非0表示连接成功,0表示失败
 */
u8 connectTlink(void)
{
    u8 sta = 0;

    sta = connectServer(TCP, TLINK_IP, TLINK_PORT); //连接服务器

    if (sta != 0)
    {
       
        sendBuffertoServer(APP_ID); //发送注册序号
    }
    else
    {
      
    }

    return sta;
}

/**
 * 功能：发送设备状态(传感器数据以及继电器状态)
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 */
void sendDeviceStatus(DeviceSta_Strcture *pdevsta)
{
    static u8 m = 0;
    char buffer[40] = {0};
    /* device.Y_Angle == 0代表俯仰角 */
    if (device.Y_Angle >= 10 && m == 0)
    {
        Delay_ms(20);
        if (device.Y_Angle >= 10 && m == 0)
        {
            m++;
            pdevsta->RED_Light = 1;
            setRelay(Light, Light_ON);
        }
    }
    else if (device.Y_Angle < 10  && m != 0)
    {
        m = 0;
        pdevsta->RED_Light = 0;
        setRelay(Light, Light_OFF);
    }
    else
    {
    }
    

        /*格式化数据帧*/
        sprintf(buffer, "FM:%d,%d,%d,%d,%d,%d,%d,%d.#", pdevsta->Humidity, pdevsta->Temperature, pdevsta->Chest, pdevsta->RED_Light, pdevsta->X_Angle, pdevsta->Y_Angle, pdevsta->Z_Angle,pdevsta->Concentration);

    /*发送数据到TLink服务器*/
    sendBuffertoServer(buffer);
}

/**
 * 功能：处理从服务器接收的控制数据
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 * 说明：该函数应该被串口空闲中断调用,已达到最佳实时性能
 */
void processDeviceStatus(DeviceSta_Strcture *pdevsta)
{
    u8 i = 0;

    /*掉线重连*/
    if ((u8)strstr(RXBuffer, "CLOSE"))
    {
       
        connectTlink();
        memset(RXBuffer, 0, RXBUFFER_LEN);
        return;
    }

    /*对应状态控制*/

    if ((u8)strstr(RXBuffer, "Light_ON"))
    {
        i = 1;
        pdevsta->RED_Light = 1;
        setRelay(Light, Light_ON);
    }
    else if ((u8)strstr(RXBuffer, "Light_OFF"))
    {
        i = 1;
        pdevsta->RED_Light = 0;
        setRelay(Light, Light_OFF);
    }

    /*清除接收缓冲并更新继电器状态到服务器*/
    if (i != 0)
    {
      
        memset(RXBuffer, 0, RXBUFFER_LEN);
        Delay_ms(200); //防止数据发包过快造成设备封禁
        sendDeviceStatus(pdevsta);
    }
}
